package gerenciadorprojetos.dao.hibernate;

import java.util.List;

import org.apache.log4j.Logger;
import gerenciadorprojetos.dao.Projeto;
import gerenciadorprojetos.dao.Usuario;
import java.util.ListIterator;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

@SuppressWarnings("unchecked")
public class ProjetoDAO extends HibernateDaoSupport {

    Logger logger = Logger.getLogger(ProjetoDAO.class);

    public List obterProjetosPorExecutor(Usuario user) {
        return getHibernateTemplate().find("FROM Projeto WHERE usuarioByExecutor = ?", user);
    }

    public List obterProjetosPorCriador(Usuario user) {
        return getHibernateTemplate().find("FROM Projeto WHERE usuarioByCriador = ?", user);
    }

    public Projeto obtemProjeto(int id) {
        return (Projeto) getHibernateTemplate().get(Projeto.class, id);
    }

    public int obterMaxID() {
        List l = getHibernateTemplate().find("SELECT MAX(idProjeto) FROM Projeto");
        ListIterator i = l.listIterator();

        if (i.hasNext()) {
            Object o = i.next();

            if (o != null) {
                logger.debug("obtemMaxID - Achou maxValue !");
                return ((Integer)o).intValue();
            } else {
                logger.debug("obtemMaxID - Não encontrou maxValue - object empty !");
                return 0;
            }
            
        } else {
            logger.debug("obtemMaxID - Não encontrou maxValue - no value !");
            return 0;
        }

    }

    public List obterProjetos() {
        List l = getHibernateTemplate().find("FROM Projeto");
        getHibernateTemplate().initialize(l);
        return l;
    }

    public boolean adicionarProjeto(Projeto proj) {
        try {
            getHibernateTemplate().save(proj);
            return true;
        } catch (DataAccessException e) {
            logger.error("Erro ao adicionar o projeto - " + e.getMessage());
            return false;
        }

    }

    public boolean removerProjeto(Projeto proj) {
        try {
            getHibernateTemplate().delete(proj);
            return true;
        } catch (DataAccessException e) {
            logger.error("Erro ao remover o projeto - " + e.getMessage());
            return false;
        }
    }

    public boolean atualizarProjeto(Projeto proj) {
        try {
            getHibernateTemplate().load(Projeto.class, new Integer(proj.getIdProjeto()));
            getHibernateTemplate().saveOrUpdate(proj);
            getHibernateTemplate().flush();
            return true;
        } catch (DataAccessException e) {
            logger.error("Erro ao atualizar o projeto - " + e.getMessage());
            return false;
        }
    }
}
